package com.zjs.jsp.fdservice.implement;

import com.zjs.jsp.domain.jsp.Jsp_Order;
import com.zjs.jsp.fdservice.Interface.PathPlanningInterface;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;


/**
 * 路径规划类
 *
 * @author 李文
 * @create 2017-09-01 13:59
 **/
public class PathPlanning implements PathPlanningInterface
{

    private static final Logger LOGGER = LoggerFactory.getLogger(PathPlanning.class);

    // 以下为 获得 两点之间最短距离
    //定义 地球半径
    private static final BigDecimal EARTH_RADIUS = new BigDecimal(6378.137);
    //定义Math.PI
    private static final BigDecimal MATH_PI = new BigDecimal(Math.PI);

    /**
     * 计算弧长
     **/
    private BigDecimal getRed(BigDecimal big) {
        return big.multiply(MATH_PI).divide(new BigDecimal(180.0), BigDecimal.ROUND_DOWN);
    }


    /**
     * 计算 两点 之间  的 最短距离
     *
     * @param jspOrder  当前订单
     * @param jspOrder1 任务包中第一个订单
     * @return 返回 数据 为 两点之间的 米数
     */
    @Override
    public BigDecimal getShortestDistance(Jsp_Order jspOrder, Jsp_Order jspOrder1) {

        try {

            BigDecimal radLat1 = getRed(jspOrder1.getSrly());
            BigDecimal radLat2 = getRed(jspOrder.getSrly());
            BigDecimal a = radLat1.subtract(radLat2);
            BigDecimal b = getRed(jspOrder1.getSrlx()).subtract(getRed(jspOrder.getSrlx()));

            Double sinA = Math.sin(a.doubleValue() / 2);
            Double sinB = Math.sin(b.doubleValue() / 2);
            Double cosA = radLat1.doubleValue();
            Double cosB = radLat2.doubleValue();
            Double obj = 2 * Math.asin(Math.sqrt(Math.pow(sinA, 2) + Math.cos(cosA) * Math.cos(cosB) * Math.pow(sinB, 2)));
            BigDecimal s = new BigDecimal(obj);
            s = s.multiply(EARTH_RADIUS);
            return format(s, 3);
        } catch (Exception e) {
            LOGGER.error(jspOrder.getOuuid() + " 计算订单经纬度距离异常  任务包订单UUDI  " + jspOrder1.getOuuid(), e);
            return new BigDecimal(10000000);
        }
    }

    private BigDecimal format(BigDecimal big, int scale) {
        scale = 0 > scale ? 0 : scale;
        big = big.setScale(scale, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(1000));
        return big;
    }

    ///**
    // *  冒泡排序
    // */
    //private static Map<Integer, Integer> sortMap(Map<Integer, Integer> linkedMap) {
    //
    //    List<Map.Entry<Integer, Integer>> cache = new ArrayList<>(linkedMap.entrySet());
    //    //重写比较函数
    //    Collections.sort(cache, (o1, o2) -> {
    //        //若返回值小于0，则o1在o2前面
    //        return o2.getValue() - o1.getValue();
    //    });
    //    Map<Integer, Integer> resultMap = new LinkedHashMap<>();
    //    //将结果插入LinkedMap然后返回
    //    for (Map.Entry<Integer, Integer> aCache : cache) {
    //        resultMap.put(aCache.getKey(), aCache.getValue());
    //    }
    //    return resultMap;
    //}
}
